/**
 * @description 统一处理App内扫码结果的处理器
 * @param {string} url - 从 uni.scanCode 获取到的原始URL字符串
 * @param {object} config - 处理器配置对象
 * @param {string} config.host - 您App的专属域名，用于识别内部链接，例如 'link.yourapp.com'
 * @param {object} config.routes - 路径路由配置表
 *
 * @example config.routes 格式:
 * const routes = {
 *   '/user/profile': {
 *     page: '/pages/user/user-info', // 目标页面路径
 *     param: 'userId' // 页面需要的主键参数名
 *   },
 *   '/post/detail': {
 *     page: '/pages/post/detail',
 *     param: 'id'
 *   }
 * };
 */
import config from '@/config/index.js';
/**
 * @description 一个兼容各端的函数，用于从URL字符串中提取主机名。
 * @param {string} urlString - 完整的URL字符串。
 * @returns {string} - 返回主机名，如果解析失败则返回空字符串。
 */
function getHostnameFromUrl(urlString) {
  if (!urlString) {
    return '';
  }
  try {
    // 使用正则表达式匹配主机名
    // 这个正则可以处理 http, https, ws, wss 等协议，并正确处理端口号
    const match = urlString.match(/^(?:https?|wss?):\/\/([^:/]+)/);
    return match ? match[1] : '';
  } catch (e) {
    console.error('解析URL失败:', e);
    return '';
  }
}
// 应用扫码路由配置
const scanConfig = {
	// 定义你的专属域名
	host:  getHostnameFromUrl(config.baseURL),

	// 定义所有可被扫描的路径及其对应的页面
	routes: {
		'/user/profile': {
			page: '/pages/user/others/others', // 目标页面
			param: 'userId'               // 页面需要接收的参数名
		},
		'/post/detail': {
			page: '/pages/post/detail',   // 另一个可扫描的页面
			param: 'id'                   // 该页面需要接收的参数名
		},
	}
};
/**
 * @description 辅助函数：解析URL字符串，兼容非Web环境。
 * @param {string} urlString - 要解析的URL。
 * @returns {object} - 返回一个包含 pathname 和 params 的对象。
 * @private
 */
function _parseURL(urlString) {
	const result = {
		pathname: '',
		params: {}
	};

	if (!urlString) {
		return result;
	}

	// 1. 分离路径和查询参数
	const queryIndex = urlString.indexOf('?');
	const pathAndHost = queryIndex === -1 ? urlString : urlString.substring(0, queryIndex);
	const queryString = queryIndex === -1 ? '' : urlString.substring(queryIndex + 1);

	// 2. 提取路径 (pathname)
	// 找到协议 "://" 之后第一个 "/" 的位置
	const protocolEndIndex = pathAndHost.indexOf('://');
	if (protocolEndIndex !== -1) {
		const pathStartIndex = pathAndHost.indexOf('/', protocolEndIndex + 3);
		if (pathStartIndex !== -1) {
			result.pathname = pathAndHost.substring(pathStartIndex);
		} else {
			result.pathname = '/'; // 如果只有域名，路径为根
		}
	} else {
		// 如果没有协议，则假定整个字符串为路径
		result.pathname = pathAndHost;
	}

	// 3. 解析查询参数
	if (queryString) {
		queryString.split('&').forEach(pair => {
			const parts = pair.split('=');
			if (parts.length > 0 && parts[0]) {
				const key = decodeURIComponent(parts[0]);
				const value = parts.length > 1 ? decodeURIComponent(parts[1]) : true; // 处理像 "?flag" 这样没有值的参数
				result.params[key] = value;
			}
		});
	}
	return result;
}

/**
 * @description 统一处理App内扫码结果的处理器
 * @param {string} url - 从 uni.scanCode 获取到的原始URL字符串
 * @param {object} config - 处理器配置对象
 * @param {string} config.host - 您App的专属域名，用于识别内部链接
 * @param {object} config.routes - 路径路由配置表
 */
export default function processScanResult(url) {
	const {
		host,
		routes = {}
	} = scanConfig || {};

	if (!host || !url) {
		console.error('ScanProcessor: host或url未提供');
		return;
	}

	if (!url.includes(host)) {
		console.log('ScanProcessor: 这是一个外部链接，不进行内部跳转。');
		uni.showModal({
			title: '扫描结果',
			content: `这是一个外部链接，是否复制？\n${url}`,
			confirmText: '复制链接',
			success: (res) => {
				if (res.confirm) {
					uni.setClipboardData({
						data: url,
						success: () => uni.showToast({
							title: '已复制'
						})
					});
				}
			}
		});
		return;
	}

	// *** 修改点：使用我们自定义的解析函数 ***
	const parsedUrl = _parseURL(url);
	const path = parsedUrl.pathname;
	const params = parsedUrl.params;

	const routeConfig = routes[path];

	if (routeConfig) {
		const paramValue = params[routeConfig.param];
		if (paramValue) {
			const targetUrl = `${routeConfig.page}?${routeConfig.param}=${paramValue}`;
			console.log(`ScanProcessor: 正在跳转至 -> ${targetUrl}`);
			uni.navigateTo({
				url: targetUrl,
				fail: (err) => {
					console.error(`ScanProcessor: 跳转失败`, err);
					uni.showToast({
						title: '页面跳转失败',
						icon: 'none'
					});
				}
			});
		} else {
			console.warn(`ScanProcessor: 路径 ${path} 缺少必要的参数 ${routeConfig.param}`);
			uni.showToast({
				title: '二维码信息不完整',
				icon: 'none'
			});
		}
	} else {
		console.warn(`ScanProcessor: 无法识别的内部路径 ${path}`);
		uni.showToast({
			title: '无法识别的二维码',
			icon: 'none'
		});
	}
}